package com.ruge.core.properties;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * description: SwaggerProperties
 * create time at 2022/6/6 11:36
 *
 * @author alice.ruge
 * @since 0.0.3
 */

@Data
@Configuration
@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties {
    /**
     * 是否开启swagger
     */
    private Boolean enabled;

    /**
     * swagger会解析的包路径
     **/
    private String basePackage = "";

    /**
     * swagger会解析的url规则
     **/
    private List<String> basePath = new ArrayList<>();

    /**
     * 在basePath基础上需要排除的url规则
     **/
    private List<String> excludePath = new ArrayList<>();
    /**
     * 需要排除的服务
     */
    private List<String> ignoreProviders = new ArrayList<>();

    /**
     * 标题
     **/
    private String title = "默认的标题，请通过【swagger.title】进行配置";
    /**
     * 描述
     **/
    private String description = "默认的描述，请通过【swagger.description】进行配置";

    /**
     * 版本
     **/
    private String version = "默认的版本，请通过【swagger.version】进行配置";

    /**
     * 许可证
     **/
    private String license = "默认的许可证，请通过【swagger.license】进行配置";

    /**
     * 许可证URL
     **/
    private String licenseUrl = "默认的许可证URL，请通过【swagger.licenseUrl】进行配置";

    /**
     * 服务条款URL
     **/
    private String termsOfServiceUrl = "默认的服务条款URL，请通过【swagger.termsOfServiceUrl】进行配置";

    /**
     * host信息
     **/
    private String host = "默认的host信息，请通过【swagger.host】进行配置";

    /**
     * 联系人信息
     */
    private Contact contact = new Contact();

    /**
     * 全局统一鉴权配置
     **/
    private Authorization authorization = new Authorization();

    @Data
    @NoArgsConstructor
    public static class Contact {

        /**
         * 联系人
         **/
        private String name = "默认的联系人，请通过【swagger.Contact.name】进行配置";

        /**
         * 联系人url
         **/
        private String url = "默认的联系人url，请通过【swagger.Contact.url】进行配置";

        /**
         * 联系人email
         **/
        private String email = "默认的联系人email，请通过【swagger.Contact.email】进行配置";

    }

    @Data
    @NoArgsConstructor
    public static class Authorization {

        /**
         * 鉴权策略ID，需要和SecurityReferences ID保持一致
         */
        private String name = "默认的鉴权策略ID，需要和SecurityReferences ID保持一致，请通过【swagger.Authorization.name】进行配置";

        /**
         * 需要开启鉴权URL的正则
         */
        private String authRegex = "^.*$";

        /**
         * 鉴权作用域列表
         */
        private List<AuthorizationScope> authorizationScopeList = new ArrayList<>();

        private List<String> tokenUrlList = new ArrayList<>();

    }

    @Data
    @NoArgsConstructor
    public static class AuthorizationScope {

        /**
         * 作用域名称
         */
        private String scope = "默认的作用域名称，请通过【swagger.AuthorizationScope.scope】进行配置";

        /**
         * 作用域描述
         */
        private String description = "默认的作用域描述，请通过【swagger.AuthorizationScope.description】进行配置";

    }
}
